package com.lxx.jmb2c.controller;

import com.lxx.jmb2c.common.Result;
import com.lxx.jmb2c.dto.AdminLoginDTO;
import com.lxx.jmb2c.service.AdminService;
import com.lxx.jmb2c.vo.AdminInfoVO;
import com.lxx.jmb2c.vo.AdminLoginVO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

/**
 * 管理员用户控制器
 * 
 * 这个控制器处理所有与管理员相关的HTTP请求，包括：
 * 1. 管理员登录
 * 2. 获取管理员信息
 * 
 * 初学者需要了解：
 * - @RestController 表示这是一个控制器，会自动将返回对象转为JSON
 * - @RequestMapping 定义了基础路径为"/admin"，所以所有接口URL都以/admin开头
 * - @Resource 是依赖注入注解，相当于自动创建AdminService实例
 * 
 * Knife4j文档说明：
 * 这个控制器下的所有接口都会在Knife4j文档中显示，可以通过
 * http://localhost:8080/doc.html 访问
 * 
 * @author lxx
 * @since 2025-07-07
 */
@Tag(name = "管理员管理", description = "管理员登录和信息获取接口")
@Slf4j
@RestController
@RequestMapping("/admin")
public class AdminController {

    @Resource
    private AdminService adminService;

    /**
     * 管理员登录接口
     * 
     * @param adminLoginDTO 登录请求体，包含用户名和密码
     * @return 登录结果，包含token等信息
     * 
     * TODO 0708 实现管理后台跟java后端互通
     * 当前待完成事项：
     * 1. 需要实现前端与后端的完整交互流程
     * 2. 需要添加参数验证逻辑
     * 
     * 初学者提示：
     * - @RequestBody 表示从请求体获取JSON数据并转为AdminLoginDTO对象
     * - log.info() 用于记录日志，方便调试
     */
    @Operation(summary = "管理员登录", description = "使用用户名和密码登录管理系统")
    @PostMapping("login")
    public Result<AdminLoginVO> login(
            @Parameter(description = "登录参数", required = true)
            @RequestBody AdminLoginDTO adminLoginDTO) {
        log.info("adminLoginDTO:{}", adminLoginDTO);
        //todo 需要在service层实现具体逻辑
        AdminLoginVO adminLoginVO = adminService.login(adminLoginDTO);
        return Result.success(adminLoginVO);
    }

    /**
     * 获取管理员信息接口
     * 
     * @return 当前登录管理员的基本信息
     * 
     * TODO 0708 实现管理后台跟java后端互通
     * 当前待完成事项：
     * 1. 需要从token中解析出管理员ID
     * 2. 需要添加权限验证
     * 
     * 初学者提示：
     * - 这个接口通常需要在登录后调用
     * - 返回的信息可能包括姓名、角色、权限等
     */
    @Operation(summary = "获取管理员信息", description = "获取当前登录管理员的基本信息")
    @PostMapping("info")
    public Result<AdminInfoVO> info() {
        AdminInfoVO adminInfoVO = this.adminService.info();
        return Result.success(adminInfoVO);
    }
}
